
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

/**
 * AUTO-GENERATED FILE. DO NOT MODIFY.
 */

// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
import { SOURCE_FORMAT_ARRAY_ROWS, SOURCE_FORMAT_OBJECT_ROWS } from '../../util/types.js';
import { makePrintable, throwError } from '../../util/log.js';
import { each } from 'zrender/lib/core/util.js';
import { normalizeToArray } from '../../util/model.js';
import { getRawValueParser, SortOrderComparator } from '../../data/helper/dataValueHelper.js';
var sampleLog = '';

if (process.env.NODE_ENV !== 'production') {
	sampleLog = ['Valid config is like:', '{ dimension: "age", order: "asc" }', 'or [{ dimension: "age", order: "asc"], { dimension: "date", order: "desc" }]'].join(' ');
}

export var sortTransform = {
	type: 'echarts:sort',
	transform: function (params) {
		var upstream = params.upstream;
		var config = params.config;
		var errMsg = ''; // Normalize
		// const orderExprList: OrderExpression[] = isArray(config[0])
		//     ? config as OrderExpression[]
		//     : [config as OrderExpression];

		var orderExprList = normalizeToArray(config);

		if (!orderExprList.length) {
			if (process.env.NODE_ENV !== 'production') {
				errMsg = 'Empty `config` in sort transform.';
			}

			throwError(errMsg);
		}

		var orderDefList = [];
		each(orderExprList, function (orderExpr) {
			var dimLoose = orderExpr.dimension;
			var order = orderExpr.order;
			var parserName = orderExpr.parser;
			var incomparable = orderExpr.incomparable;

			if (dimLoose == null) {
				if (process.env.NODE_ENV !== 'production') {
					errMsg = 'Sort transform config must has "dimension" specified.' + sampleLog;
				}

				throwError(errMsg);
			}

			if (order !== 'asc' && order !== 'desc') {
				if (process.env.NODE_ENV !== 'production') {
					errMsg = 'Sort transform config must has "order" specified.' + sampleLog;
				}

				throwError(errMsg);
			}

			if (incomparable && incomparable !== 'min' && incomparable !== 'max') {
				var errMsg_1 = '';

				if (process.env.NODE_ENV !== 'production') {
					errMsg_1 = 'incomparable must be "min" or "max" rather than "' + incomparable + '".';
				}

				throwError(errMsg_1);
			}

			if (order !== 'asc' && order !== 'desc') {
				var errMsg_2 = '';

				if (process.env.NODE_ENV !== 'production') {
					errMsg_2 = 'order must be "asc" or "desc" rather than "' + order + '".';
				}

				throwError(errMsg_2);
			}

			var dimInfo = upstream.getDimensionInfo(dimLoose);

			if (!dimInfo) {
				if (process.env.NODE_ENV !== 'production') {
					errMsg = makePrintable('Can not find dimension info via: ' + dimLoose + '.\n', 'Existing dimensions: ', upstream.cloneAllDimensionInfo(), '.\n', 'Illegal config:', orderExpr, '.\n');
				}

				throwError(errMsg);
			}

			var parser = parserName ? getRawValueParser(parserName) : null;

			if (parserName && !parser) {
				if (process.env.NODE_ENV !== 'production') {
					errMsg = makePrintable('Invalid parser name ' + parserName + '.\n', 'Illegal config:', orderExpr, '.\n');
				}

				throwError(errMsg);
			}

			orderDefList.push({
				dimIdx: dimInfo.index,
				parser: parser,
				comparator: new SortOrderComparator(order, incomparable)
			});
		}); // TODO: support it?

		var sourceFormat = upstream.sourceFormat;

		if (sourceFormat !== SOURCE_FORMAT_ARRAY_ROWS && sourceFormat !== SOURCE_FORMAT_OBJECT_ROWS) {
			if (process.env.NODE_ENV !== 'production') {
				errMsg = 'sourceFormat "' + sourceFormat + '" is not supported yet';
			}

			throwError(errMsg);
		} // Other upstream format are all array.

		var resultData = [];

		for (var i = 0, len = upstream.count(); i < len; i++) {
			resultData.push(upstream.getRawDataItem(i));
		}

		resultData.sort(function (item0, item1) {
			for (var i = 0; i < orderDefList.length; i++) {
				var orderDef = orderDefList[i];
				var val0 = upstream.retrieveValueFromItem(item0, orderDef.dimIdx);
				var val1 = upstream.retrieveValueFromItem(item1, orderDef.dimIdx);

				if (orderDef.parser) {
					val0 = orderDef.parser(val0);
					val1 = orderDef.parser(val1);
				}

				var result = orderDef.comparator.evaluate(val0, val1);

				if (result !== 0) {
					return result;
				}
			}

			return 0;
		});
		return {
			data: resultData
		};
	}
};